import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import com.mysql.jdbc.Statement;


public class InsertionDatabase {
	public ArrayList<String> listeVector = new ArrayList<String>();
	private int pointPli = 0;
	private int winningTeam = 0;
	Statement statement = null;
	
	public InsertionDatabase() {
		try {
		    Class.forName("com.mysql.jdbc.Driver").newInstance();
		    Connection conn = java.sql.DriverManager.getConnection("jdbc:mysql://localhost/essai1?user=root");
			statement = (Statement) conn.createStatement();
		} catch(Exception e){
			e.printStackTrace(); 
		}
	}
	
	public ArrayList<String> getListeVector() {return listeVector;}
	public void setListeVector(ArrayList<String> listeVector) {this.listeVector = listeVector;}
	public int getPointPli() {return pointPli;}
	public void setPointPli(int pointPli) {	this.pointPli = pointPli;}
	public int getWinningTeam() {return winningTeam;}
	public void setWinningTeam(int winningTeam) {this.winningTeam = winningTeam;}

	public class Vect{int idVecteur; long vecteur; double points;}
	
	public ArrayList<Vect> VectPoint = new ArrayList<Vect>();
	
	public void insertionDataBase() {
		String Requete = new String();
		
		for (int i=0; i<4; i++) {
			if (i%2==winningTeam) {
				Requete="INSERT INTO vecteur (vecteur, points) VALUES ('"+this.listeVector.get(i)+"', "+this.pointPli+")";
			} else {
				Requete="INSERT INTO vecteur (vecteur, points) VALUES ('"+this.listeVector.get(i)+"', -"+this.pointPli+")";
			}
			try {
				statement.executeUpdate(Requete);
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}				
	}
	
	/**	En formulant une bonne requete, on aura tout de suite le fichier qu'il faut	*/
	public void traiterDataBase() {
		String Requete = "SELECT vecteur, AVG(points) FROM vecteur GROUP BY vecteur";
//		String Requete = "SELECT vecteur, points FROM vecteur GROUP BY vecteur";
//		String Requete = "SELECT vecteur, points FROM vecteur";
		ResultSet rs = null;
		
		try {
			rs = statement.executeQuery(Requete);
			
			try {
				BufferedWriter bw = new BufferedWriter(new FileWriter("ressources/BeloteVecteurs.txt"));
				while (rs.next()) {
					String vecteur = rs.getString("vecteur");
					float points = rs.getFloat("AVG(points)");
					System.out.println(vecteur+"  "+points);
					bw.write(vecteur+"  "+points+"\n");
				}
				rs.close();
				bw.close();
			} catch (FileNotFoundException exception) {
				exception.printStackTrace();
			} catch (IOException exception) {
				exception.printStackTrace();
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}	
	}
	
	public Vect findVector(long vector, long seuil) {
		String Requete = "";
		ResultSet rs = null;
		ArrayList<Vect> listeVect = new ArrayList<Vect>();
		
		try {
			Requete = "SELECT idVecteur, vecteur, AVG(points) FROM vecteur GROUP BY vecteur";
			rs = statement.executeQuery(Requete);
			while (rs.next()) {
				Vect vecte = new Vect();
				vecte.idVecteur = rs.getInt("idVecteur");
				vecte.vecteur = rs.getLong("vecteur");
				vecte.points = rs.getFloat("AVG(points)");
				if (vector-seuil<vecte.vecteur && vecte.vecteur<vector+seuil) {
					listeVect.add(vecte);
//					ToString(listeVect.get(listeVect.size()-1));
				}
			}
			rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
/*		if (listeVect.isEmpty()) {
			seuil*=5;
			findVector(vector, seuil);
		}
*/		listeVect = triListe(listeVect, vector);
		ToString(listeVect.get(listeVect.size()-1));
		return listeVect.get(listeVect.size()-1);
	}
	
	public ArrayList<Vect> triListe(ArrayList<Vect> lst, long vector) {
		for (int i=0; i<lst.size(); i++) {
			for (int j=i+1; j<lst.size(); j++) {
				if (Math.abs(lst.get(i).vecteur-vector) < Math.abs(lst.get(j).vecteur-vector)) {
					lst.add(i, lst.get(j));
					lst.add(j+1, lst.get(i+1));
					lst.remove(i+1);
					lst.remove(j+1);
				}
			}
		}
		return lst;
	}
	
	public long conversionStringLong(String text) {
		long stringConverti=0;
		long test=0;
		for (int i=0; i<text.length(); i++) {
			test=(int)text.toCharArray()[i]-48;
			for (int j=0; j<text.length()-i-1; j++) test*=10;
			stringConverti+=test;
		}
		return stringConverti;
	}
	
	public void ToString(Vect vect) {
		System.out.println(vect.idVecteur+"\t"+vect.vecteur+"\t"+vect.points);
	}
}
